package com.spzx.gateway.handler;

import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import com.spzx.common.core.exception.CaptchaException;
import com.spzx.common.core.web.domain.AjaxResult;
import com.spzx.gateway.service.ValidateCodeService;
import reactor.core.publisher.Mono;

/**
 * 验证码获取处理器。
 *
 * 该类实现了HandlerFunction接口，用于处理验证码的生成和返回。它依赖于ValidateCodeService服务来创建验证码，
 * 并将结果封装为AjaxResult对象返回给客户端。如果在生成验证码过程中发生异常（如CaptchaException或IOException），
 * 则会将异常抛出并由调用者处理。
 *
 * @author spzx
 */
@Component
public class ValidateCodeHandler implements HandlerFunction<ServerResponse>
{
    /**
     * 注入验证码服务，用于生成验证码。
     */
    @Autowired
    private ValidateCodeService validateCodeService;

    /**
     * 处理验证码请求。
     *
     * @param serverRequest 服务器请求对象，包含客户端发送的所有信息。
     * @return 返回一个包含验证码响应的Mono对象，表示异步操作完成。
     */
    @Override
    public Mono<ServerResponse> handle(ServerRequest serverRequest)
    {
        AjaxResult ajax;
        try
        {
            // 调用ValidateCodeService服务生成验证码，并将结果封装到AjaxResult对象中
            ajax = validateCodeService.createCaptcha();
        }
        catch (CaptchaException | IOException e)
        {
            // 如果生成验证码时发生异常（如验证码生成失败或IO错误），则直接返回异常
            return Mono.error(e);
        }

        // 构建HTTP响应，状态码为200 OK，并将AjaxResult对象作为响应体返回
        return ServerResponse.status(HttpStatus.OK).body(BodyInserters.fromValue(ajax));
    }
}
